﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Prototipo.control;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloTipoDocumentos;

namespace SIGEB.Prototipo.Control
{
    public class controlDocumentos
    {
        #region "constructores

        public controlDocumentos(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #endregion

        #region "validación"

        internal bool valoresDocumentoValido(documento nuevo)
        {
            if (idValido(nuevo.codDocumento, true))
                if (tituloValido(nuevo.titulo))
                    if (descriptoresValidos(nuevo.descriptores))
                        if (clasificacionesValida(nuevo.clasificacion))
                            if (serieValida(nuevo.serie))
                                if (tipoDocValido(nuevo.atributos.codTipoDocumento))
                                    if (editorialValida(nuevo.editorialD.nombre))
                                        if (autorValido(nuevo.autorD.nombre))
                                            if (tipoDocumentoValoresValidos(nuevo.atributos, nuevo.valores))
                                                return true;
            return false;        
        }

        internal bool tipoDocumentoValoresValidos(tipoDocumento tipoDocumento, LinkedList<valor> valores)
        {
            if (tipoDocumento != null && tipoDocumento.atributos != null && valores != null)
            {
                foreach (atributo act in tipoDocumento.atributos)
                {
                    valor actual = buscarValor(valores, act.codAtributo);
                    if (!act.valorValido(actual.campoText))
                    {
                        return false; 
                    }
                }
                return true;
            }
            return false;
        }

        internal valor buscarValor(LinkedList<valor> valores, string cod)
        {
            if (valores != null && !string.IsNullOrEmpty(cod))
            {
                foreach (valor act in valores)
                {
                    if (act.idAtributo == cod)
                    {
                        return act;
                    }
                }
            }
            return null;
        }

        internal bool idValido(string idDoc, bool requerido)
        {
            return Validacion.LongitudCadenaValida(idDoc, requerido, 20);
        }

        internal bool tituloValido(string titulo)
        {
            return Validacion.LongitudCadenaValida(titulo, true, 150);
        }

        internal bool descriptoresValidos(string desc)
        {
            return Validacion.LongitudCadenaValida(desc, true, 1000);
        }

        internal bool clasificacionesValida(string clasificacion)
        {
            return Validacion.LongitudCadenaValida(clasificacion, false, 60);
        }

        internal bool serieValida(string serie)
        {
            return Validacion.LongitudCadenaValida(serie, false, 60);
        }

        internal bool tipoDocValido(string tipoDoc)
        {
            return cp.ctrlTipoDoc.obtenerTipoDocumento(tipoDoc) != null;
        }

        internal bool editorialValida(string edito)
        {
            return Validacion.LongitudCadenaValida(edito, true, 100);
        }

        internal bool autorValido(string aut)
        {
            return Validacion.LongitudCadenaValida(aut, true, 100);
        }

        internal bool datosModificablesValidos(documento doc)
        {
            return true;
        }

        private bool textoBusquedaValido(string texto)
        {
            return Validacion.LongitudCadenaValida(texto, true, 0);
        }

       
        #endregion

        #region "métodos"

        internal void agregarDocumento(documento nuevo)
        {
            if (!valoresDocumentoValido(nuevo))
            {
                throw new Exception("Los valores del documento no son válidos");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_AGREGAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            cp.datos.documentos.agregarDocumento(nuevo);
        }

        internal void modificarDatos(string idDoc, documento doc)
        {
            if (!datosModificablesValidos(doc))
            {
                throw new Exception("Error de los datos modificables");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_MODIFICAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            cp.datos.documentos.modificarDocumento(idDoc, doc);
        }

        internal void eliminar(string id)
        {
            if (!idValido(id,true))
            {
                throw new Exception("El id no es válido");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_ELIMINAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            cp.datos.documentos.eliminarDocumento(id);
        }

        internal LinkedList<documento> todosDocumentos()
        {
            if (!cp.usuarioActualPuede(acciones.DOCS_CONSULTAR) && !cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                return null;
            }
            return cp.datos.documentos.obtenerTodos();
        }

        internal documento documentoCodigo(string id)
        {
            if (!idValido(id,true))
            {
                return null;
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_CONSULTAR) && !cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                return null;
            }
            return cp.datos.documentos.obtenerDocumento(id);
        }

        internal documento documentoCodigoConsulta(string id)
        {
            if (!idValido(id, true))
            {
                throw new Exception("id documento inválido");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_CONSULTAR) && !cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                return null;
            }

            return cp.datos.documentos.obtenerXCodigoDocumento(id);
        }

        internal LinkedList<documento> documentoAutor(string autor)
        {
            if (!autorValido(autor))
            {
                throw new Exception("autor inválido");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_CONSULTAR) && !cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                return null;
            }
            return cp.datos.documentos.obtenerXautor(autor);
        }

        internal LinkedList<documento> documentoTitulo(string titulo)
        {
            if (!tituloValido(titulo))
            {
                throw new Exception("autor inválido");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_CONSULTAR) && !cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                return null;
            }
            return cp.datos.documentos.obtenerXtitulo(titulo);
        }

        internal LinkedList<documento> documentoLibre(string texto)
        {
            if (!textoBusquedaValido(texto))
            {
                throw new Exception("texto de búsqueda inválido");
            }
            if (!cp.usuarioActualPuede(acciones.DOCS_CONSULTAR) && !cp.usuarioActualPuede(acciones.CONSULTA_CONSULTAR))
            {
                return null;
            }
            return cp.datos.documentos.busquedaLibre(texto);
        }

        internal LinkedList<tipoDocumento> tiposDocumentos()
        {
            return cp.datos.tiposDocumentos.obtenerTiposDocumento();
        }

        #endregion

        #region "atributos"
        
        internal controlPrincipal cp { get; set; }

        #endregion
    }
}
